/*
 * @(#)DateUtil.java Dec 13, 2007
 * 
 * Copyright 2007 by ChinanetCenter Corporation.
 *
 * All rights reserved.
 *
 * This software is the confidential and proprietary information of
 * ChinanetCenter Corporation ("Confidential Information").  You
 * shall not disclose such Confidential Information and shall use
 * it only in accordance with the terms of the license agreement
 * you entered into with ChinanetCenter.
 * 
 */
package com.cnc.fd.util;

import java.net.URL;
import java.net.URLDecoder;
import java.net.URLEncoder;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;

/**
 * @author 阿闲
 * @date   Dec 13, 2007
 * @version 1.0
 */
public class DateUtil {
    
    /**
     * 数据库存储的时间格式串，如yyyymmdd 或yyyymmddHHMiSS
     */
    public static final int DB_STORE_DATE = 1;
    /**
     * 用连字符-分隔的时间时间格式串，如yyyy-mm-dd 或yyyy-mm-dd HH:Mi:SS
     */
    public static final int HYPHEN_DISPLAY_DATE = 2;
    /**
     * 用连字符.分隔的时间时间格式串，如yyyy.mm.dd 或yyyy.mm.dd HH:Mi:SS
     */
    public static final int DOT_DISPLAY_DATE = 3;
    /**
     * 用中文字符分隔的时间格式串，如yyyy年mm月dd 或yyyy年mm月dd HH:Mi:SS
     */
    public static final int CN_DISPLAY_DATE = 4;
    /**
     * **数据库存储时间格式串,如yyyymmddHHMissSS*
     */
    public static final int DB_LONG_DATE = 5;
	
	/**
	 * 获取当天零点的时间，并转换成long
	 * @return 20071213000000
	 */
	public static Long getLongTimestampForZero(){
		
		SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd");
		
		StringBuffer sb = new StringBuffer(sdf.format(new Date()));
		
		sb.append("000000");
		
		return new Long(sb.toString());		
	
	}
	
	/**
     * 获取当天日期
     * @return 2010-09-15
     */
    public static String getCurrentDate(){
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
        return sdf.format(new Date());
    }
    
    /**
     * 获取当前时间
     * @return 2010-10-14
     */
    public static String getCurrentTime(){
        SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddHHmmss");
        return sdf.format(new Date());
    }
    
    
    /**
     * 获取当前时间
     * @return 20101014
     */
    public static String getSimpleCurrentDate(){
        SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd");
        return sdf.format(new Date());
    }
    
    /**
     * 得到精确到天的指定时间格式化日期串
     *
     * @param date       指定时间
     * @param formatType 时间格式的类型{@link #DB_STORE_DATE},{@link #EN_HTML_DISPLAY_DATE},{@link #CN_HTML_DISPLAY_DATE}
     * @return 指定时间格式化日期串
     */
    public static String getDateStr(Date date, String formatStr) {
        SimpleDateFormat sdf = new SimpleDateFormat(formatStr);
        return sdf.format(date);
    }
    
    /**
     * 将显示格式的时间字符串转换为数据库存储的类型
     *
     * @param dateStr 最小4位，最大19位。显示的时间格式时间串如:2004-12-12
     * @return 数据库存储的时间字符串
     */
    public static String toStoreStr(String dateStr) {
        if (dateStr == null || dateStr.trim().equals("")) {
            return "";
        }
        StringBuffer strBuf = new StringBuffer();
        for (int i = 0; i < dateStr.length(); i++) {
            if (dateStr.charAt(i) >= '0' && dateStr.charAt(i) <= '9') {
                strBuf.append(dateStr.charAt(i));
            }
        }
        return strBuf.toString();
    }
    
    /**
     * 将数据库存储的日期格式串转换为各种显示的格式
     *
     * @param dateStr    最小6位，最大14位的数据库存储格式时间串如:20041212
     * @param formatType 时间格式的类型{@link #DB_STORE_DATE},{@link #EN_HTML_DISPLAY_DATE},{@link #CN_HTML_DISPLAY_DATE}
     * @return 格式化的时间串
     */
    public static String toDisplayStr(String dateStr, int formatType) {
        if (formatType < DB_STORE_DATE || formatType > CN_DISPLAY_DATE) {
            throw new IllegalArgumentException("时间格式化类型不是合法的值。");
        }
        if (dateStr == null || dateStr.length() < 6 || dateStr.length() > 14 ||
                formatType == DB_STORE_DATE) {
            return dateStr;
        } else {
            char[] charArr = null;
            switch (formatType) {
                case HYPHEN_DISPLAY_DATE:
                    charArr = new char[]{
                            '-', '-', ' ', ':', ':'};
                    break;
                case DOT_DISPLAY_DATE:
                    charArr = new char[]{
                            '.', '.', ' ', ':', ':'};
                    break;
                case CN_DISPLAY_DATE:
                    charArr = new char[]{'年', '月', '日', ':', ':'};
                    break;
                default:
                    charArr = new char[]{
                            '-', '-', ' ', ':', ':'};
            }
            try {
                SimpleDateFormat sdf_1 = null;
                SimpleDateFormat sdf_2 = null;
                switch (dateStr.length()) {
                    case 6:
                        sdf_1 = new SimpleDateFormat("yyyyMM");
                        sdf_2 = new SimpleDateFormat("yyyy'" + charArr[0] +
                                "'MM");
                        break;
                    case 7:    // TODO 为了数据库错误的日期格式添加，正式版删除。
                        sdf_1 = new SimpleDateFormat("yyyyMMd");
                        sdf_2 = new SimpleDateFormat("yyyy'" + charArr[0] +
                                "'MM'" + charArr[1] + "'d");
                        break;
                    case 8:
                        sdf_1 = new SimpleDateFormat("yyyyMMdd");
                        sdf_2 = new SimpleDateFormat("yyyy'" + charArr[0] +
                                "'MM'" + charArr[1] + "'dd"+charArr[2]);
                        break;
                    case 10:
                        sdf_1 = new SimpleDateFormat("yyyyMMddHH");
                        sdf_2 = new SimpleDateFormat("yyyy'" + charArr[0] +
                                "'MM'" + charArr[1] + "'dd'" +
                                "+charArr[2]" +
                                "'HH");
                        break;
                    case 12:
                        sdf_1 = new SimpleDateFormat("yyyyMMddHHmm");
                        sdf_2 = new SimpleDateFormat("yyyy'" + charArr[0] +
                                "'MM'" + charArr[1] + "'dd'" +
                                charArr[2] +
                                "'HH'" + charArr[3] + "'mm");
                        break;
                    case 14:
                        sdf_1 = new SimpleDateFormat("yyyyMMddHHmmss");
                        sdf_2 = new SimpleDateFormat(
                                "yyyy'" + charArr[0] + "'MM'" + charArr[1] +
                                        "'dd'" + charArr[2] + "'HH'" + charArr[3] +
                                        "'mm'" + charArr[4] + "'ss");
                        break;
                    default:
                        return dateStr.trim();
                }
                return sdf_2.format(sdf_1.parse(dateStr)).trim();
            } catch (ParseException ex) {
                return dateStr.trim();
            }
        }
    }
    
    /**
     * 根据inFmt的样式，日期时间字符串转化为日期时间对象
     *
     * @param datestr String
     *                日期时间字符串，如：20041001、2004年10月01日 15:03
     * @param format  String
     *                对datestr参数格式说明，参照类说明，如yyyyMMdd、yyyy年MM月dd日 HH:mm
     * @return Date
     *         日期时间对象，格式inFmt非法时，使用yyyyMMdd格式
     */
    public static Date getDate(String datestr, String format) {
        if (datestr == null || datestr.trim().equals("")) {
            return null;
        }
        if (format == null || format.trim().equals("")) { //inFmt非法
            format = "yyyyMMdd";
        }

        try {
            //依据inFmt格式把日期字符串转化为日期对象
            SimpleDateFormat dateFormat = new SimpleDateFormat(format);
            dateFormat.setLenient(true);
            return dateFormat.parse(datestr);
        } catch (ParseException e) {
            throw new IllegalArgumentException(e);
        }
    }

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		System.out.println(getCurrentTime());
		 
	    

	}

}


